package com.wbs.aop;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @Author: 芝梦
 * @Description: aop:面型切面编程   作为指定方法的通知切面
 *              通知: 前置通知   后置通知    返回后通知   异常通知   环绕通知
 *              @Aspect             面向
 *              @Before             前置
 *              @AfterReturning     返回后
 *              @Pointcut           切入点
 * @DateTime: 2024/1/25 14:32
 */
@Component
@Aspect
@Slf4j
public class AopLog {

    //代替将来需要打印日志的所有方法
    @Pointcut("execution(public * com.wbs.service.*.*(..))||@annotation(com.wbs.aop.LogAn)")
    public void log(){}

    //前置通知
    @Before("log()")
    public void beforeLog(JoinPoint point){
        //获取方法名
        Signature signature = point.getSignature();
        //获取参数
        Object[] args = point.getArgs();
        log.info("正在执行 方法: {},参数: {}",signature,args);
    }

    //返回后通知
    @AfterReturning(value = "log()", returning = "result")
    public void afterReturningLog(Object result){
        //SpecificationVO 对象    JSON形式返回
        log.info("方法返回值: {}", JSONObject.toJSONString(result));
    }
}
